iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
自我挑戰組

解三十天的 CodeWars系列 第 10

A Man and his Umbrellas

  • 分享至 

  • xImage
  •  

CodeWars 題目

Link

難度

5 kyu

題目

上下班遇到下雨帶傘,可能會因為沒下雨放在公司或家裡;計算需要的雨傘數量。

思路

使用 switch 做不同處理。

for loop 跑迴圈,表示經過所有天氣。
根據天氣修改紀錄雨傘的變數。

pseudo code

let umbrella = 0

for(loop array)
switch(array[i])
case "no rain"
if(umbrella !== 0) umbrella--;
case "rain"
umbrella++

實作

function minUmbrellas(weather) {
   let umbrella = {
      home: 0,
      company: 0
   };
   for (let i = 0; i < weather.length; i++) {
      if (weather[i] === 'rainy' || weather[i] === 'thunderstorms') {
         if (i % 2 == 0 && umbrella["home"] == 0) {
            umbrella["company"]++;
         }
         if (i % 2 == 1 && umbrella["company"] == 0) {
            umbrella["home"]++;
         }
         if (i % 2 == 0 && umbrella["home"] !== 0) {
            umbrella["home"]--;
            umbrella["company"]++;
         }
         if (i % 2 == 1 && umbrella["company"] !== 0) {
            umbrella["home"]++;
            umbrella["company"]--;
         }
      }
   }
   return umbrella["home"] + umbrella["company"];
}

陣列的序列是以 家 ⇒ 公司,然後反覆切換為序列。
並且除了下雨與否之外,又分為目前所在地有傘、沒傘的差別。

用 umbrella 物件來記錄存放在這兩地的雨傘數量,並且預設為 0。
會有雨傘變化的時候只有下雨天,其他天氣條件可以無視;
所以只驗證天氣 rainy 和 thunderstorms 的時候。

再分成四個情境去判斷物件的增減:

  • 從家裡出發,並且家裡沒傘;公司的傘會增加。
  • 從公司出發,並且公司沒傘;家裡的傘會增加。
  • 從家裡出發,並且家裡有傘;家裡的傘帶一隻去公司。
  • 從公司出發,並且公司有傘,公司的傘帶回去家裡一隻。

最後合併兩地的傘,即為答案。

他人的解法

function minUmbrellas(weather) {
  let home = 0;
  let office = 0;
  
  for (let i = 0; i < weather.length; i++) {
    if (["thunderstorms", "rainy"].includes(weather[i])) {
        if (i%2) {
          if (home) home--;
          office++;
        } else {
          if (office) office--;
          home++;
        }
    }
  }
  return home + office;
}

其實也是同樣的概念,但寫的更簡潔了。
includes 會回傳布林值,如果為 true 會進行內部的 if else。

同樣會判斷四個情境條件,最後相加兩地的雨傘數量

心得

第十天!鐵人賽終於進行到三分之一了!


上一篇
Moving Zeros To The End
下一篇
Directions Reduction
系列文
解三十天的 CodeWars30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言